home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / network / ka9q / nhclb120.zoo / ipcmd.c < prev    next >
C/C++ Source or Header  |  1992-06-20  |  5KB  |  249 lines

  1. /* IP-related user commands */
  2. #include <stdio.h>
  3.  
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "internet.h"
  7. #include "timer.h"
  8. #include "netuser.h"
  9. #include "iface.h"
  10. #include "ip.h"
  11. #include "cmdparse.h"
  12.  
  13. int doipaddr(),doipstat(),dottl();
  14. extern char badhost[];
  15. struct cmds ipcmds[] = {
  16.     "address",    doipaddr,    0,    NULLCHAR,    NULLCHAR,
  17.     "status",    doipstat,    0,    NULLCHAR,    NULLCHAR,
  18.     "ttl",        dottl,        0,    NULLCHAR,    NULLCHAR,
  19.     NULLCHAR,    NULLFP,        0,
  20.         "ip subcommands: address status ttl",    NULLCHAR,
  21. };
  22. doip(argc,argv)
  23. int argc;
  24. char *argv[];
  25. {
  26.     return subcmd(ipcmds,argc,argv);
  27. }
  28. int
  29. doipaddr(argc,argv)
  30. int argc;
  31. char *argv[];
  32. {
  33.     char *inet_ntoa();
  34.     int32 n;
  35.  
  36.     if(argc < 2) {
  37.         printf("%s\n",inet_ntoa(ip_addr));
  38.     } else if((n = resolve(argv[1])) == 0){
  39.         printf(badhost,argv[1]);
  40.         return 1;
  41.     } else{
  42. #ifdef DEBUG
  43.       printf("dje debug: %x\n",n);
  44. #endif
  45.         ip_addr = n;
  46.           }
  47.     return 0;
  48. }
  49. int
  50. dottl(argc,argv)
  51. char *argv[];
  52. {
  53.     if(argc < 2)
  54.         printf("%u\n",uchar(ip_ttl));
  55.     else
  56.         ip_ttl = atoi(argv[1]);
  57.     return 0;
  58. }
  59.  
  60. /* "route" subcommands */
  61. int doadd(),dodrop();
  62. static struct cmds rtcmds[] = {
  63.     "add", doadd, 3,
  64.     "route add <dest addr>[/<bits>] <if name> [gateway] [metric]",
  65.     "Add failed",
  66.  
  67.     "drop", dodrop, 2,
  68.     "route drop <dest addr>[/<bits>]",
  69.     "Not in table",
  70.  
  71.     NULLCHAR, NULLFP, 0,
  72.     "route subcommands: add, drop",
  73.     NULLCHAR, 
  74. };
  75.  
  76. /* Display and/or manipulate routing table */
  77. int
  78. doroute(argc,argv)
  79. int argc;
  80. char *argv[];
  81. {
  82.     if(argc < 2){
  83.         dumproute();
  84.         return 0;
  85.     }
  86.     return subcmd(rtcmds,argc,argv);
  87. }
  88. /* Add an entry to the routing table
  89.  * E.g., "add 1.2.3.4 ax0 5.6.7.8 3"
  90.  */
  91. int
  92. doadd(argc,argv)
  93. int argc;
  94. char *argv[];
  95. {
  96.     struct interface *ifp;
  97.     int32 dest,gateway;
  98.     unsigned bits;
  99.     char *bitp;
  100.     int metric;
  101.  
  102.     if(strcmp(argv[1],"default") == 0){
  103.         dest = 0;
  104.         bits = 0;
  105.     } else {
  106.         if((dest = resolve(argv[1])) == 0){
  107.             printf(badhost,argv[1]);
  108.             return 1;
  109.         }
  110.  
  111.         /* If IP address is followed by an optional slash and
  112.          * a length field, (e.g., 128.96/16) get it;
  113.          * otherwise assume a full 32-bit address
  114.          */
  115.         if((bitp = index(argv[1],'/')) != NULLCHAR){
  116.             bitp++;
  117.             bits = atoi(bitp);
  118.         } else
  119.             bits = 32;
  120.     }
  121.     for(ifp=ifaces;ifp != NULLIF;ifp = ifp->next){
  122.         if(strcmp(argv[2],ifp->name) == 0)
  123.             break;
  124.     }
  125.     if(ifp == NULLIF){
  126.         printf("Interface \"%s\" unknown\n",argv[2]);
  127.         return 1;
  128.     }
  129.     if(argc > 3){
  130.         if((gateway = resolve(argv[3])) == 0){
  131.             printf(badhost,argv[3]);
  132.             return 1;
  133.         }
  134.     } else {
  135.         gateway = 0;
  136.     }
  137.     if(argc > 4)
  138.         metric = atoi(argv[4]);
  139.     else
  140.         metric = 0;
  141.  
  142.     rt_add(dest,bits,gateway,metric,ifp);
  143.     return 0;
  144. }
  145. /* Drop an entry from the routing table
  146.  * E.g., "drop 128.96/16
  147.  */
  148. /*ARGSUSED*/
  149. int
  150. dodrop(argc,argv)
  151. int argc;
  152. char *argv[];
  153. {
  154.     char *bitp;
  155.     unsigned bits;
  156.     int32 n;
  157.  
  158.     if(strcmp(argv[1],"default") == 0){
  159.         n = 0;
  160.         bits = 0;
  161.     } else {
  162.         /* If IP address is followed by an optional slash and length field,
  163.          * (e.g., 128.96/16) get it; otherwise assume a full 32-bit address
  164.          */
  165.         if((bitp = index(argv[1],'/')) != NULLCHAR){
  166.             bitp++;
  167.             bits = atoi(bitp);
  168.         } else
  169.             bits = 32;
  170.  
  171.         if((n = resolve(argv[1])) == 0){
  172.             printf(badhost,argv[1]);
  173.             return 1;
  174.         }
  175.     }
  176.     return rt_drop(n,bits);
  177. }
  178.  
  179. /* Dump IP routing table
  180.  * Dest              Length    Interface    Gateway          Metric
  181.  * 192.001.002.003   32        sl0          192.002.003.004       4
  182.  */
  183. int
  184. dumproute()
  185. {
  186.     register unsigned int i,bits;
  187.     register struct route *rp;
  188.  
  189.     printf("Dest              Length    Interface    Gateway          Metric\n");
  190.     if(r_default.interface != NULLIF){
  191.         printf("default           0         %-13s",
  192.          r_default.interface->name);
  193.         if(r_default.gateway != 0)
  194.             printf("%-17s",inet_ntoa(r_default.gateway));
  195.         else
  196.             printf("%-17s","");
  197.         printf("%6u\n",r_default.metric);
  198.     }
  199.     for(bits=1;bits<=32;bits++){
  200.         for(i=0;i<NROUTE;i++){
  201.             for(rp = routes[bits-1][i];rp != NULLROUTE;rp = rp->next){
  202.                 printf("%-18s",inet_ntoa(rp->target));
  203.                 printf("%-10u",bits);
  204.                 printf("%-13s",rp->interface->name);
  205.                 if(rp->gateway != 0)
  206.                     printf("%-17s",inet_ntoa(rp->gateway));
  207.                 else
  208.                     printf("%-17s","");
  209.                 printf("%6u\n",rp->metric);
  210.             }
  211.         }
  212.     }
  213.     return 0;
  214. }
  215.  
  216. /*ARGSUSED*/
  217. int
  218. doipstat(argc,argv)
  219. int argc;
  220. char *argv[];
  221. {
  222.     extern struct ip_stats ip_stats;
  223.     extern struct reasm *reasmq;
  224.     register struct reasm *rp;
  225.     register struct frag *fp;
  226.     char *inet_ntoa();
  227.  
  228.     printf("IP: total %ld runt %u len err %u vers err %u",
  229.         ip_stats.total,ip_stats.runt,ip_stats.length,ip_stats.version);
  230.     printf(" chksum err %u badproto %u\n",
  231.         ip_stats.checksum,ip_stats.badproto);
  232.  
  233.     if(reasmq != NULLREASM)
  234.         printf("Reassembly fragments:\n");
  235.     for(rp = reasmq;rp != NULLREASM;rp = rp->next){
  236.         printf("src %s",inet_ntoa(rp->source));
  237.         printf(" dest %s",inet_ntoa(rp->dest));
  238.         printf(" id %u pctl %u time %lu len %u\n",
  239.             rp->id,uchar(rp->protocol),rp->timer.count,rp->length);
  240.         for(fp = rp->fraglist;fp != NULLFRAG;fp = fp->next){
  241.             printf(" offset %u last %u\n",fp->offset,fp->last);
  242.         }
  243.     }
  244.     doicmpstat();
  245.     doslipstat();
  246.     return 0;
  247. }
  248.  
  249.